才15天就快不符合主題了,說好的入門呢
JavaScript被執行時會產生執行環境(execution Context),
執行環境分為全域環境
跟區域環境
預設的環境,在這環境宣告的變數為全域變數。
在呼叫函式時會產生的執行環境,在區域環境下宣告的變數為區域變數,
函式執行完畢後該執行環境消滅。
...上面好像都是廢話,所以執行環境有甚麼用?
簡單說的話,一個執行環境會建立:
JavaScript會用呼叫堆疊(call stack)來追蹤目前的執行環境,
最後建立的執行環境會被加在堆疊最上方,執行結束後會從堆疊取出。
例子:
var str = '全域變數';
function funcA() {
var str = '區域變數A';
funcB();
console.log(str);
}
function funcB() {
var str = '區域變數B';
console.log(str);
}
funcA();
console.log(str);
用圖簡單解釋JS執行中call stack的變化(堆疊最上面的就是目前的執行環境)
4. 印出str(區域變數B)後,執行環境消滅,相關的記憶體空間釋放
5. 回到funcA,印出str(區域變數A)後消滅,相關的記憶體空間釋放
6. 回到全域環境印出str(全域變數)
雖然宣告了三次變數str,但他們都是在不同執行環境下宣告的,所以彼此之間不影響。
如果有人覺得三個str之間不影響是因為他們是不同的函式,下面有個相同函式的範例
var a = 0;
function func() {
var x = 1;
x += a;
if (a++ < 1) {
func();
}
console.log('x等於' + x);
}
func();
執行結果:
這個函式會呼叫自己一次,呼叫自己後產生了新的執行環境,
造成即使是同一個函式,但執行環境不同不會互相影響
知道執行環境跟call stack對了解this的特性很重要,
鐵人賽後半場都是各種機制跟名詞解說,還請多指教